<?php
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9503);

const USER_MAP_FILE = 'users.json'; // 存储用户ID与FD的映射关系
const AI_HOST_FILE = 'ai_host_fd.txt'; // 存储AI_HOST的FD

// 保存用户映射到文件
function saveUserMap($userMap) {
    file_put_contents(USER_MAP_FILE, json_encode($userMap));
}

// 从文件中加载用户映射
function loadUserMap() {
    if (file_exists(USER_MAP_FILE)) {
        return json_decode(file_get_contents(USER_MAP_FILE), true);
    }
    return [];
}

// 初始化用户映射
$userMap = loadUserMap();

// 获取AI_HOST的FD
function getAIHostFd() {
    if (file_exists(AI_HOST_FILE)) {
        return intval(file_get_contents(AI_HOST_FILE));
    }
    return null;
}

// 保存AI_HOST的FD到文件
function saveAIHostFd($fd) {
    file_put_contents(AI_HOST_FILE, $fd);
}

// 删除AI_HOST的FD文件
function deleteAIHostFd() {
    if (file_exists(AI_HOST_FILE)) {
        unlink(AI_HOST_FILE);
    }
}

// 监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
    global $userMap;
    $userId = $request->get['user_id'] ?? 'default_user';
    $userFd = $request->fd;

    // 从文件中加载用户映射
    $userMap = loadUserMap();

    // 如果用户已存在，则更新 FD，否则新增用户
    if (isset($userMap[$userId])) {
        echo "用户 {$userId} 已上线，更新 FD 为 {$userFd}\n";
    } else {
        echo "新用户 {$userId} 上线，添加到用户映射\n";
    }

    // 更新用户映射
    $userMap[$userId] = $userFd;

    // 保存用户映射到文件
    saveUserMap($userMap);

    echo "用户 {$userId} (fd: {$userFd}) 上线了\n";

    // 如果是 AI_HOST，更新 AI_HOST 的 FD
    if ($userId === 'AI_HOST') {
        // 检查是否已经有 AI_HOST 的 FD
        $existingAIHostFd = getAIHostFd();
        if ($existingAIHostFd !== $userFd) {
            saveAIHostFd($userFd);
            echo "AI_HOST的FD已更新到文件\n";
        } else {
            echo "AI_HOST的FD未变化\n";
        }
    }
});
// 监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
    global $userMap;
    // 从文件中加载用户映射
    $userMap = loadUserMap();
    
    $aiHostFd = getAIHostFd();

    if ($aiHostFd === null) {
        echo "AI_HOST未上线，无法处理消息\n";
        return;
    }

    $msg = json_decode($frame->data, true);
    if (!isset($msg['userid'])) {
        echo "消息格式错误，缺少userid\n";
        return;
    }

    $fromUser = $msg['userid'];
    $message = $msg['message'] ?? '';

    echo "收到消息: " . json_encode($msg) . "\n";

    if ($fromUser === 'AI_HOST') {
        // 如果消息来自 AI_HOST，转发给目标用户
        $targetUserId = $msg['target'] ?? 'unknown_user';
        if (isset($userMap[$targetUserId])) {
            $targetFd = $userMap[$targetUserId];
            // 检查目标用户的连接是否仍然存在
            if ($ws->exist($targetFd)) {
                $ws->push($targetFd, json_encode([
                    'userid' => 'AI_HOST',
                    'message' => $message
                ]));
                echo "消息已发送给用户 {$targetUserId}\n";
            } else {
                echo "目标用户 {$targetUserId} 的连接已关闭\n";
                unset($userMap[$targetUserId]); // 移除已关闭的用户
                saveUserMap($userMap);
            }
        } else {
            echo "目标用户 {$targetUserId} 不在线\n";
        }
    } else {
        // 如果消息来自普通用户，转发给 AI_HOST
        $msgToSend = [
            'userid' => $fromUser,
            'message' => $message
        ];
        $ws->push($aiHostFd, json_encode($msgToSend));
        echo "消息已转发至AI_HOST\n";
    }
});

// 监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
    global $userMap;
    $userMap = loadUserMap();

    foreach ($userMap as $userId => $userFd) {
        if ($userFd === $fd) {
            unset($userMap[$userId]);
            saveUserMap($userMap);
            echo "用户 {$userId} (fd: $fd) 离线\n";
            break;
        }
    }

    $aiHostFd = getAIHostFd();
    if ($aiHostFd === $fd) {
        echo "AI_HOST 离线\n";
        deleteAIHostFd();
    }
});

// 示例：在服务器启动后，向指定用户发送消息
$ws->on('start', function ($ws) {
    echo "服务器已启动！\n";
});

$ws->start();